/* jshint esversion: 6 */
import Vue from 'vue';
import Vuex from 'vuex';
Vue.use(Vuex);
// 使用Vuex: 1安装 2import 3use 4new, 5挂载到vm中 6 单独js export store
var cart = JSON.parse(localStorage.getItem('cart')) || [];

const store = new Vuex.Store({
    state: { //使用this.$store.state.XXX
        cart: cart,
    },
    mutations: { //this.$store.commit('fnName','params')
        // 第一个参数是state,第二个参数最好是对象

        // ========购物车逻辑============
        // goodsObj:{goodsId, selectedNum, color, size, checked}
        addToCartList(state, goodsObj) {
            // 模拟数据
            /* 可能是更新数量或者新添加的 */
            var flag = false;
            state.cart.some((item) => {
                if (item.goodsId == goodsObj.goodsId) {
                    item.selectedNum += parseInt(goodsObj.selectedNum);
                    flag = true;
                    return true;
                }
            });

            if (!flag) {
                state.cart.push(goodsObj);
            }
            localStorage.setItem("cart", JSON.stringify(state.cart));

        },
        // 购物车页面的加减数量改变，数量改变只要加减就可以
        // 已经设置数字选择框最小是1，最大是库存余量，所以用但判断是否已经减到0
        updateCartNum(state, goodsObj) {
            state.cart.some(ele => {
                if (ele.goodsId == goodsObj.goodsId) {
                    ele.selectedNum = goodsObj.selectedNum;
                    return true;
                }
            });
            // 修改数据后直接覆盖掉之前的数据
            localStorage.setItem("cart", JSON.stringify(state.cart));
        },
        // 修改颜色和尺码信息：
        // 修改后的goodsId是否与现有的有相同的，有相同的则两者数量相加
        // 1如果颜色和尺码一致，那么就数量加1
        // 2 如果颜色不一致尺码一致，或者颜色和尺码都不一致，则需要将之前的替换成新的sku，需要修改购物车的图片（从服务器请求）
        // 3 如果颜色一致尺码不一致，就替换掉
        // o:{goodsId(gid+sid+cid),gid,cid,sid} 存id就可以，不需要存具体值
        updateItemChoice(state, o) {
            var num = "",
                old = {},
                index = "";
            // 得到原来的数量，对象，索引
            state.cart.some((ele,i) =>{
                if (ele.goodsId == o.originId){
                    old = ele;
                    num = ele.selectedNum;
                    index = i;
                    return true;
                }
            });
            // 判断原数组内是否有与修改后的一样的goodsId
            // 有的话，就两个数量相加，然后删除旧的
            var isExist = false;
            state.cart.some(ele => {
                if(ele.goodsId == o.goodsId) {
                    ele.selectedNum += num;
                    state.cart.splice(index,1);
                    isExist = true;
                    return true;
                }
            });
            // 如果没有相同goodsId的话，即得到的是一个全新的对象，就将新的替换旧的
            if(!isExist) {
                state.cart.some(ele => {
                    // 找到修改的商品
                if (ele.goodsId == o.originId) {

                    // 如果没有改变颜色和尺码与之前一样就不改变
                    if (ele.goodsId == o.goodsId) {
                        return true;
                        // 如果改变了颜色或者尺码，就替换掉原来的
                    } else if (ele.cid !== o.cid || ele.sid !== o.sid) {
                        ele = Object.assign(ele, o);
                    }
                }
                });
            }
            localStorage.setItem("cart", JSON.stringify(state.cart));
        },
        updateItemStatus(state, o) {
            state.cart.some(item => {
                if (item.goodsId == o.goodsId) {
                    item.checked = o.checked;
                    return true;
                }
            });
            localStorage.setItem("cart", JSON.stringify(state.cart));
        },
        selectAllOrNot(state, data) {
            state.cart.forEach(item => {
                item.checked = data;
            });
            localStorage.setItem("cart", JSON.stringify(state.cart));
        },
        // splice 是在原数组上进行修改，原数组改变
        // slice 是得到一个新数组，原数组不变
        deleteCartItem(state, id) {
            // console.log(state.cart);
            state.cart.some((item, index) => {
                if (item.goodsId == id) {
                    state.cart.splice(index, 1);
                    // console.log(state.cart);
                }
            });
            localStorage.setItem("cart", JSON.stringify(state.cart));
        },
    },
    getters: { //this.$store.getters.XXX
        getItemIdArr(state) {
            var idArr = [];
            state.cart.forEach(item => {
                idArr.push(item.goodsId);
            });
            return idArr;
        },
        getTotalNum(state) {
            var totalNum = 0;
            state.cart.forEach(item => {
                totalNum += item.selectedNum;
            });
            return totalNum;
        },
        getItemNum(state) {
            var obj = {};
            // 生成一个对象，id值做键，数量值做值
            state.cart.forEach(item => {
                obj[item.goodsId] = parseInt(item.selectedNum);
            });
            return obj;
        },
        getItemStatus(state) {
            var obj = {};
            // 生成一个对象，id值做键，数量值做值
            state.cart.forEach(item => {
                obj[item.goodsId] = item.checked;
            });
            return obj;
        },
        getTotalCost(state) {
            var totalCost = 0;
            state.cart.forEach(ele => {
                if (ele.checked) {
                    totalCost += parseInt(ele.selectedNum) * parseInt(ele.price);
                }
            });
            return totalCost;
        },
        getTotalCount(state) {
            var totalCount = 0;
            state.cart.forEach(ele => {
                if (ele.checked) {
                    totalCount += parseInt(ele.selectedNum);
                }
            });
            return totalCount;
        },
        // getters 的使用是与 v-on 等绑定的时候，返回值要设置成对象
        // getters 内调用 getters 的方法，第二个参数写getters，调用具体方法时，使用getters.方法名就可以
        allSelect(state, getters) {
            var flagObj = {
                flag: true
            };
            if (getters.getTotalNum == getters.getTotalCount) {
                return flagObj;
            } else {
                flagObj.flag = false;
                return flagObj;
            }
        },
    },
});


export default store;